// REG_OP(Add)
//     .INPUT(x1, TensorType({DT_FLOAT}))
//     .INPUT(x2, TensorType({DT_FLOAT}))
//     .OUTPUT(y, TensorType({DT_FLOAT}))
//     .OP_END_FACTORY_REG(Add)

// REG_OP(FurthestPointSamplingWithDist)
//     .INPUT(points_dist, TensorType({DT_FLOAT}))
//     .INPUT(nearest_temp, TensorType({DT_FLOAT}))
//     .OUTPUT(index, TensorType({DT_INT32}))
//     .REQUIRED_ATTR(num_points, Int)
//     .OP_END_FACTORY_REG(FurthestPointSamplingWithDist)

// REG_OP(Nms3dNormal)
//     .INPUT(boxes, TensorType({DT_FLOAT, DT_FLOAT16}))
//     .OUTPUT(keep, TensorType({DT_INT16}))
//     .REQUIRED_ATTR(nms_overlap_thresh, Float)
//     .OP_END_FACTORY_REG(Nms3dNormal)

// REG_OP(FurthestPointSampling)
//     .INPUT(point_xyz, TensorType({DT_FLOAT}))
//     .INPUT(nearest_temp, TensorType({DT_FLOAT}))
//     .OUTPUT(index, TensorType({DT_INT32}))
//     .REQUIRED_ATTR(num_points, Int)
//     .OP_END_FACTORY_REG(FurthestPointSampling)

// REG_OP(DynamicScatterGrad)
//     .INPUT(grad_voxel_feats, TensorType({DT_FLOAT}))
//     .INPUT(prefix_sum_point_per_voxel, TensorType({DT_INT32}))
//     .INPUT(argsort_coor, TensorType({DT_INT32}))
//     .INPUT(compare_mask, TensorType({DT_UINT16}))
//     .OUTPUT(grad_point_feats, TensorType({DT_FLOAT}))
//     .ATTR(reduce_type, String, "max")
//     .OP_END_FACTORY_REG(DynamicScatterGrad)
